#include "widgetslidercouleur.h"
#include "ui_widgetslidercouleur.h"
#include <iostream>

using namespace std;

WidgetSliderCouleur::WidgetSliderCouleur(QWidget *parent) :
    QDockWidget(parent),
    ui(new Ui::WidgetSliderCouleur)
{
    ui->setupUi(this);
    mw = (MainWindow*) parent;
    calque=NULL;
}

WidgetSliderCouleur::~WidgetSliderCouleur()
{
    delete ui;
}

void WidgetSliderCouleur::paintEvent(QPaintEvent *) {
    if(mw->getMdiArea()->activeSubWindow()) {
        this->setEnabled(true);
    } else {
        this->setEnabled(false);
    }
}

////////////// ROUGE

void WidgetSliderCouleur::on_sliderrouge_valueChanged(int value)
{
    if(calque==NULL) {
        fi = (FenetreImage*) mw->getMdiArea()->activeSubWindow()->widget();
        calque = fi->getCalqueCourant();
        copy = new QImage(calque->copy());
    }
    uint* line, *result;
    int rouge = 0;
    for(int y=0; y<copy->height(); y++){
        line = (uint*) copy->scanLine(y);
        result = (uint*) calque->scanLine(y);
        for(int x=0; x < copy->width(); x++){
            if( (qRed(line[x])+value < 0)) {
                rouge = 0;
            } else if(qRed(line[x])+value > 255) {
                rouge = 255;
            } else {
                rouge = qRed(line[x])+value;
            }
            result[x] = qRgb(rouge,qGreen(line[x]), qBlue(line[x]));
        }
    }
    fi->updateCalqueCourant();
}

///////////////// VERT

void WidgetSliderCouleur::on_slidervert_valueChanged(int value)
{
    if(calque==NULL) {
        fi = (FenetreImage*) mw->getMdiArea()->activeSubWindow()->widget();
        calque = fi->getCalqueCourant();
        copy = new QImage(calque->copy());
    }
    uint* line, *result;
    int vert;
    for(int y=0; y<copy->height(); y++){
        line = (uint*) copy->scanLine(y);
        result = (uint*) calque->scanLine(y);
        for(int x=0; x < copy->width(); x++){
            if( (qGreen(line[x])+value < 0)) {
                vert = 0;
            } else if(qGreen(line[x])+value > 255) {
                vert = 255;
            } else {
                vert = qGreen(line[x])+value;
            }

            result[x] = qRgb(qRed(line[x]),vert, qBlue(line[x]));
        }
    }
    fi->updateCalqueCourant();
}

///////////////////// Bleu

void WidgetSliderCouleur::on_sliderbleu_valueChanged(int value)
{
    if(calque==NULL) {
        fi = (FenetreImage*) mw->getMdiArea()->activeSubWindow()->widget();
        calque = fi->getCalqueCourant();
        copy = new QImage(calque->copy());
    }
    uint* line, *result;
    int bleu;
    for(int y=0; y<copy->height(); y++){
        line = (uint*) copy->scanLine(y);
        result = (uint*) calque->scanLine(y);
        for(int x=0; x < copy->width(); x++){
            if( (qBlue(line[x])+value < 0)) {
                bleu = 0;
            } else if(qBlue(line[x])+value > 255) {
                bleu = 255;
            } else {
                bleu = qBlue(line[x])+value;
            }

            result[x] = qRgb(qRed(line[x]),qGreen(line[x]), bleu);
        }
    }
    fi->updateCalqueCourant();
}

///////////// Cyan
void WidgetSliderCouleur::on_slidercyan_valueChanged(int value){
    if(calque==NULL) {
        fi = (FenetreImage*) mw->getMdiArea()->activeSubWindow()->widget();
        calque = fi->getCalqueCourant();
        copy = new QImage(calque->copy());
    }
    uint* line, *result;
    int bleu, vert;
    for(int y=0; y<copy->height(); y++){
        line = (uint*) copy->scanLine(y);
        result = (uint*) calque->scanLine(y);
        for(int x=0; x < copy->width(); x++){
            if( (qBlue(line[x])+value < 0)) {
                bleu = 0;
            } else if(qBlue(line[x])+value > 255) {
                bleu = 255;
            } else {
                bleu = qBlue(line[x])+value;
            }

            if( (qGreen(line[x])+value < 0)) {
                vert = 0;
            } else if(qGreen(line[x])+value > 255) {
                vert = 255;
            } else {
                vert = qGreen(line[x])+value;
            }

            result[x] = qRgb(qRed(line[x]),vert, bleu);
        }
    }
    fi->updateCalqueCourant();
}


///////////// Magenta
void WidgetSliderCouleur::on_slidermagenta_valueChanged(int value) {
    if(calque==NULL) {
        fi = (FenetreImage*) mw->getMdiArea()->activeSubWindow()->widget();
        calque = fi->getCalqueCourant();
        copy = new QImage(calque->copy());
    }
    uint* line, *result;
    int rouge, bleu;
    for(int y=0; y<copy->height(); y++){
        line = (uint*) copy->scanLine(y);
        result = (uint*) calque->scanLine(y);
        for(int x=0; x < copy->width(); x++){
            if( (qBlue(line[x])+value < 0)) {
                bleu = 0;
            } else if(qBlue(line[x])+value > 255) {
                bleu = 255;
            } else {
                bleu = qBlue(line[x])+value;
            }

            if( (qRed(line[x])+value < 0)) {
                rouge = 0;
            } else if(qRed(line[x])+value > 255) {
                rouge = 255;
            } else {
                rouge = qRed(line[x])+value;
            }

            result[x] = qRgb(rouge,qGreen(line[x]), bleu);
        }
    }
    fi->updateCalqueCourant();
}



//////////// Jaune
void WidgetSliderCouleur::on_sliderjaune_valueChanged(int value) {
    if(calque==NULL) {
        fi = (FenetreImage*) mw->getMdiArea()->activeSubWindow()->widget();
        calque = fi->getCalqueCourant();
        copy = new QImage(calque->copy());
    }
    uint* line, *result;
    int rouge, vert;
    for(int y=0; y<copy->height(); y++){
        line = (uint*) copy->scanLine(y);
        result = (uint*) calque->scanLine(y);
        for(int x=0; x < copy->width(); x++){
            if( (qRed(line[x])+value < 0)) {
                rouge = 0;
            } else if(qRed(line[x])+value > 255) {
                rouge = 255;
            } else {
                rouge = qRed(line[x])+value;
            }

            if( (qGreen(line[x])+value < 0)) {
                vert = 0;
            } else if(qGreen(line[x])+value > 255) {
                vert = 255;
            } else {
                vert = qGreen(line[x])+value;
            }

            result[x] = qRgb(rouge,vert, qBlue(line[x]));
        }
    }
    fi->updateCalqueCourant();
}


void WidgetSliderCouleur::on_sliderlum_valueChanged(int value)
{
    if(calque==NULL) {
        fi = (FenetreImage*) mw->getMdiArea()->activeSubWindow()->widget();
        calque = fi->getCalqueCourant();
        copy = new QImage(calque->copy());
    }
    uint* line, *result;
    for(int y=0; y<copy->height(); y++){
        line = (uint*) copy->scanLine(y);
        result = (uint*) calque->scanLine(y);
        for(int x=0; x < copy->width(); x++){
            QColor couleur = QColor::fromRgba(line[x]);
            int lum = couleur.lightness();
            if(lum + value < 0)
                lum = 0;
            else if (lum+value > 255)
                lum=255;
            else
                lum = lum+value;
            couleur.setHsl(couleur.hslHue(), couleur.hslSaturation(),lum);
            result[x]=qRgb(couleur.toRgb().red(),couleur.toRgb().green(),couleur.toRgb().blue());
        }
    }
    fi->updateCalqueCourant();
}



void WidgetSliderCouleur::on_sliderteinte_valueChanged(int value)
{
    if(calque==NULL) {
        fi = (FenetreImage*) mw->getMdiArea()->activeSubWindow()->widget();
        calque = fi->getCalqueCourant();
        copy = new QImage(calque->copy());
    }
    uint* line, *result;
    for(int y=0; y<copy->height(); y++){
        line = (uint*) copy->scanLine(y);
        result = (uint*) calque->scanLine(y);
        for(int x=0; x < copy->width(); x++){
            QColor couleur = QColor::fromRgba(line[x]);
            int teinte = couleur.hslHue();
            teinte = abs((teinte+value)%360);

            couleur.setHsl(teinte, couleur.hslSaturation(),couleur.lightness());
            result[x]=qRgb(couleur.toRgb().red(),couleur.toRgb().green(),couleur.toRgb().blue());
        }
    }
    fi->updateCalqueCourant();
}

void WidgetSliderCouleur::on_slidersaturation_valueChanged(int value)
{
    if(calque==NULL) {
        fi = (FenetreImage*) mw->getMdiArea()->activeSubWindow()->widget();
        calque = fi->getCalqueCourant();
        copy = new QImage(calque->copy());
    }
    uint* line, *result;
    for(int y=0; y<copy->height(); y++){
        line = (uint*) copy->scanLine(y);
        result = (uint*) calque->scanLine(y);
        for(int x=0; x < copy->width(); x++){
            QColor couleur = QColor::fromRgba(line[x]);
            int saturation = couleur.hslSaturation();
            if(saturation + value < 0)
                saturation = 0;
            else if (saturation+value > 255)
                saturation=255;
            else
                saturation = saturation+value;
            couleur.setHsl(couleur.hslHue(), saturation,couleur.lightness());
            result[x]=qRgb(couleur.toRgb().red(),couleur.toRgb().green(),couleur.toRgb().blue());
        }
    }
    fi->updateCalqueCourant();
}

void WidgetSliderCouleur::on_annuler_clicked()
{
    razVal();
}


void WidgetSliderCouleur::on_appliquer_clicked()
{/*
    fi = (FenetreImage*) mw->getMdiArea()->activeSubWindow()->widget();
    ElementHistorique* eh = new ElementHistorique(QString("Utilisation sliders"),new Calque(*copy,calque->getPosX(),calque->getPosY()));
    fi->historique.ajouter(eh);*/
    calque=NULL;
    razVal();
}

void WidgetSliderCouleur::razVal(){
    ui->sliderlum->setValue(0);
    ui->sliderteinte->setValue(0);
    ui->slidersaturation->setValue(0);
    ui->sliderrouge->setValue(0);
    ui->slidervert->setValue(0);
    ui->sliderbleu->setValue(0);
    ui->slidercyan->setValue(0);
    ui->slidermagenta->setValue(0);
    ui->sliderjaune->setValue(0);
}
